/**
 * @author 徐楠
 * @date 2022/3/10 15:19
 * @version 1.0
 */

package com.xunan.likou;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class TheMinimumNumberOfOperationsEqualizesTheArrayElements {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3};
        int i = minMoves(nums);
        System.out.println(i);
    }

    /**
     * 因为只需要找出让数组所有元素相等的最小操作次数，
     * 所以我们不需要考虑数组中各个元素的绝对大小，
     * 即不需要真正算出数组中所有元素相等时的元素值，只需要考虑数组中元素相对大小的变化即可。
     *
     * 因此，每次操作既可以理解为使 n-1 个元素增加 1，
     * 也可以理解使 1 个元素减少 1。显然，后者更利于我们的计算。
     *
     * 于是，要计算让数组中所有元素相等的操作数，
     * 我们只需要计算将数组中所有元素都减少到数组中元素最小值所需的操作数，即计算
     *
     * n−1
     * ∑   nums[i]−min(nums)∗n
     * i=0
     *
     * 其中 n 为数组 nums 的长度，min(nums)为数组 nums 中元素的最小值。
     * 在实现中，为避免溢出，我们可以逐个累加每个元素与数组中元素最小值的差，即计算
     *
     * n−1
     * ∑   (nums[i]−min(nums))
     * i=0
     *
     *
     * @param nums
     * @return
     */
    public static int minMoves(int[] nums) {
        int length = nums.length;
        Arrays.sort(nums);
        int min = nums[0];
        int result = 0;
        for (int i = 0; i < length; i++) {
            result = result + (nums[i] - min);
        }
        return result;
    }
}
